//package com.tgpms.generator.config;
//
//
//import io.netty.util.internal.StringUtil;
//import org.mybatis.generator.api.CommentGenerator;
//import org.mybatis.generator.api.IntrospectedColumn;
//import org.mybatis.generator.api.IntrospectedTable;
//import org.mybatis.generator.api.dom.java.*;
//import org.mybatis.generator.api.dom.xml.TextElement;
//import org.mybatis.generator.api.dom.xml.XmlElement;
//import org.mybatis.generator.config.PropertyRegistry;
//
//import java.net.InetAddress;
//import java.net.UnknownHostException;
//import java.text.SimpleDateFormat;
//import java.util.Calendar;
//import java.util.Properties;
//import java.util.Set;
//
//import static org.mybatis.generator.internal.util.StringUtility.isTrue;
//
///**
// * @author May
// * <p>
// * 加强 MyBatis的逆向功能
// */
//public class GeneratorConfig implements CommentGenerator {
//
//    /**
//     * properties 配置文件
//     */
//    private Properties properties;
//
//    /**
//     * properties 配置文件
//     */
//    private Properties systemPro;
//
//    /*
//     * 父类时间
//     */
//    private boolean suppressDate;
//
//    /**
//     * 父类所有注释
//     */
//    private boolean suppressAllComments;
//
//    /**
//     * 当前时间
//     */
//    private String currentDateStr;
//
//    /**
//     * 构造赋值
//     */
//    public GeneratorConfig() {
//        super();
//        properties = new Properties();
//        systemPro = System.getProperties();
//        suppressDate = false;
//        suppressAllComments = false;
//        currentDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
//                .format(Calendar.getInstance().getTime());
//    }
//
//    /**
//     * 格式化日期字符串以包含在Javadoc标记和XML注释
//     *
//     * @return null
//     */
//    protected String getDateString() {
//        String result = null;
//        if (!suppressDate) {
//            result = currentDateStr;
//        }
//        return result;
//    }
//
//    /**
//     * 从该配置中的任何属性添加此实例的属性CommentGenerator配置
//     *
//     * @param properties
//     */
//    @Override
//    public void addConfigurationProperties(Properties properties) {
//        this.properties.putAll(properties);
//        suppressDate = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
//        suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
//    }
//
//    /**
//     * 为字段添加注释
//     *
//     * @param field
//     * @param introspectedTable
//     * @param introspectedColumn
//     */
//    @Override
//    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
//        if (suppressAllComments) {
//            return;
//        }
//        StringBuilder sb = new StringBuilder();
//        field.addJavaDocLine("/**");
//        sb.append(" * ");
//        if (StringUtil.isNullOrEmpty(introspectedColumn.getRemarks())) {
//            try {
//                sb.append(" 作者：").append(InetAddress.getLocalHost().getHostName());
//            } catch (UnknownHostException e) {
//                e.printStackTrace();
//            }
//        } else {
//            sb.append(introspectedColumn.getRemarks());
//        }
//        field.addJavaDocLine(sb.toString().replace("\n", " "));
//        field.addJavaDocLine(" */");
//    }
//
//    /**
//     * Java属性注释
//     *
//     * @param field
//     * @param introspectedTable
//     */
//    @Override
//    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
//        if (suppressAllComments) {
//            return;
//        }
//        StringBuilder sb = new StringBuilder();
//        field.addJavaDocLine("/**");
//        sb.append(" * ");
//        sb.append(introspectedTable.getFullyQualifiedTable());
//        field.addJavaDocLine(sb.toString().replace("\n", " "));
//        field.addJavaDocLine(" */");
//    }
//
//    /**
//     * entity 类上添加注释
//     * 这里是同时包含了父子类的实体，但是这里需要单独处理父类的注解
//     *
//     * @param topLevelClass
//     * @param introspectedTable
//     */
//    @Override
//    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
//        if (suppressAllComments) {
//            return;
//        }
//        // 父类必要的包
//        topLevelClass.addImportedType("lombok.Data");
//        topLevelClass.addImportedType("lombok.NoArgsConstructor");
//        topLevelClass.addImportedType("lombok.AllArgsConstructor");
//
//        // 父类实体需要的注解
//        topLevelClass.addAnnotation("@Data");
//        topLevelClass.addAnnotation("@NoArgsConstructor");
//        topLevelClass.addAnnotation("@AllArgsConstructor");
//
//        // 序列化接口
//        topLevelClass.addSuperInterface(new FullyQualifiedJavaType("java.io.Serializable"));
//
//        topLevelClass.addJavaDocLine("/**");
//        topLevelClass.addJavaDocLine("* " + introspectedTable.getRemarks() + " 实体");
//        topLevelClass.addJavaDocLine("* ");
//        try {
//            topLevelClass.addJavaDocLine("* @Author: " + InetAddress.getLocalHost().getHostName());
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//        }
//        topLevelClass.addJavaDocLine("* @CreateDate: " + Calendar.getInstance().getTime());
//        topLevelClass.addJavaDocLine("*/");
//    }
//
//    /**
//     * Java类的类注释
//     *
//     * @param innerClass
//     * @param introspectedTable
//     */
//    @Override
//    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
//        if (suppressAllComments) {
//            return;
//        }
//        innerClass.addJavaDocLine("/**");
//        innerClass.addJavaDocLine("* ");
//        try {
//            innerClass.addJavaDocLine("* @author: " + InetAddress.getLocalHost().getHostName());
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//        }
//        innerClass.addJavaDocLine("* @createDate: " + getDateString());
//        innerClass.addJavaDocLine("*/");
//    }
//
//    /**
//     * 类级别注释
//     *
//     * @param innerClass
//     * @param introspectedTable
//     * @param b
//     */
//    @Override
//    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {
//        if (suppressAllComments) {
//            return;
//        }
//        innerClass.addJavaDocLine("/**");
//        innerClass.addJavaDocLine("*");
//        try {
//            innerClass.addJavaDocLine("* @author: " + InetAddress.getLocalHost().getHostName());
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//        }
//        innerClass.addJavaDocLine("* @CreateDate: " + getDateString());
//        innerClass.addJavaDocLine("*/");
//    }
//
//    /**
//     * 为枚举添加注释
//     *
//     * @param innerEnum
//     * @param introspectedTable
//     */
//    @Override
//    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
//        StringBuilder sb = new StringBuilder();
//        if (suppressAllComments) {
//            return;
//        }
//        innerEnum.addJavaDocLine("/**");
//        sb.append(" * ");
//        sb.append(introspectedTable.getFullyQualifiedTable());
//        innerEnum.addJavaDocLine(sb.toString().replace("\n", " "));
//        innerEnum.addJavaDocLine(" */");
//    }
//
//    /**
//     * GETTER 我觉得没必要了，因为我们用了Lombok
//     *
//     * @param method
//     * @param introspectedTable
//     * @param introspectedColumn
//     */
//    @Override
//    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
//
//    }
//
//    /**
//     * 同样的， SETTER同样的没什么用了
//     *
//     * @param method
//     * @param introspectedTable
//     * @param introspectedColumn
//     */
//    @Override
//    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
//
//    }
//
//    /**
//     * 普通方法的注释，这里主要是 DAO 里面的接口方法的注释
//     *
//     * @param method
//     * @param introspectedTable
//     */
//    @Override
//    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
//        if (suppressAllComments) {
//            return;
//        }
//        method.addJavaDocLine("/**");
//
//        // 这里和阿里巴巴的Java规范插件有点冲突，所以就去掉 @Description描述，否则会有警告
//        method.addJavaDocLine(" * " + introspectedTable.getRemarks() + "  " + method.getName() + " 实现");
//        method.addJavaDocLine(" * ");
//        method.addJavaDocLine(" * @param " + method.getParameters().get(0).getName());
//        method.addJavaDocLine(" * @return null " + method.getReturnType());
//        try {
//            method.addJavaDocLine(" * @author: " + InetAddress.getLocalHost().getHostName());
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//        }
//        method.addJavaDocLine(" * @createDate: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
//                .format(Calendar.getInstance().getTime()));
//        method.addJavaDocLine(" */");
//    }
//
//    /**
//     * 给Java文件加注释，这个注释是在文件的顶部，也就是package上面
//     *
//     * @param compilationUnit
//     */
//    @Override
//    public void addJavaFileComment(CompilationUnit compilationUnit) {
//
//    }
//
//    /**
//     * Mybatis的Mapper.xml文件里面的注释
//     *
//     * @param xmlElement
//     */
//    @Override
//    public void addComment(XmlElement xmlElement) {
//        if (!this.suppressAllComments) {
//            xmlElement.addElement(new TextElement("<!--"));
//            StringBuilder sb = new StringBuilder();
//            sb.append(xmlElement.getName()).append("语句操作").append("\n");
//            try {
//                sb.append(" 作者： ").append(InetAddress.getLocalHost().getHostName());
//            } catch (UnknownHostException e) {
//                e.printStackTrace();
//            }
//            String s = String.valueOf(Calendar.getInstance().getTime());
//            if (s != null) {
//                sb.append(s);
//                xmlElement.addElement(new TextElement(sb.toString()));
//            }
//            xmlElement.addElement(new TextElement("-->"));
//        }
//    }
//
//    /**
//     * 为调用此方法作为根元素的第一个子节点添加注释
//     *
//     * @param xmlElement
//     */
//    @Override
//    public void addRootComment(XmlElement xmlElement) {
//
//    }
//
//    @Override
//    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
//
//    }
//
//    @Override
//    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
//
//    }
//
//    @Override
//    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
//
//    }
//
//    @Override
//    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
//
//    }
//
//    @Override
//    public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
//
//    }
//}
